import { Component, Node } from "cc";


/**
 * UI容器类
 * 存储所有被标记的子节点
 * 同时获取被标记的子节点的组件
 */
export default class NodeMap
{   
    /**
     * 被标记的子节点的名称前缀
     */
    public static readonly  PRE_NAME : string = "_";

    /**
     * 节点map
     */
    private nodeMap : Map<string,Node> = new Map();

    private compMap : Map<string,Map<string,Component>> = new Map();

    /**
     * 搜索并加载目标节点中所有 PRE_NAME 开头的节点
     * @param root 目标节点
     */
    SearchAllNode(root : Node){
        for(let child of root.children)
        {
            if(child.name.startsWith(NodeMap.PRE_NAME))
            {
                this.nodeMap.set(child.name.slice(NodeMap.PRE_NAME.length),child)
                //  把这个节点所有的组件塞进去
                let comps = new Map<string,Component>()
                for (let comp of child.components) {
                    comps.set(comp.constructor.name,comp);
                }
                this.compMap.set(child.name.slice(NodeMap.PRE_NAME.length),comps);
            }
            //  递归获取所有节点
            this.SearchAllNode(child);
        }
    }

    /**
     * 获取map中节点
     * @param key 节点的键（记得去掉下划线）
     * @returns 节点
     */
    GetNode(key:string) : Node
    {
        return this.nodeMap.get(key);
    }

    /**
     * 尝试删除节点
     * @param key 节点的键（记得去掉下划线）
     * @returns 是否删除成功
     */
    TryRemove(key:string) : boolean{
        return this.nodeMap.delete(key)
    }

    /**
     * 获取节点组件(记得尖括号)
     * @param nodeKey 节点的键（记得去掉下划线）
     * @param typeName 组件类型名 class.name
     * @returns 组件
     */
    GetComponent<T extends Component>(nodeKey : string,typeName : string) : T{
        return this.compMap.get(nodeKey).get(typeName) as T;
    }

    /**
     * 测试：打印compMap
     */
    TestProntCompMap()
    {
        console.log(this.compMap);
    }

    /**
     * 测试：打印nodeMap
     */
    TestProntNodeMap()
    {
        console.log(this.nodeMap);
    }
    
}

